package com.siwei.eqi.util;

import com.siwei.eqi.pojo.entity.GuangdongLandUse;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 计算水源涵养指数（Water Conservation Index, WRC）
 */
public class WaterConservationCalculatorUtil {

    // 归一化系数（国家规范）
    private static final BigDecimal A_CON = new BigDecimal("526.7926");

    public static BigDecimal calculateWRC(GuangdongLandUse landUse) {
        // 1. 计算水域贡献值（权重0.45）
        BigDecimal waterContribution = calculateWaterContribution(landUse)
                .multiply(new BigDecimal("0.45"));

        // 2. 计算林地贡献值（权重0.35）
        BigDecimal forestContribution = calculateForestContribution(landUse)
                .multiply(new BigDecimal("0.35"));

        // 3. 计算草地贡献值（权重0.20）
        BigDecimal grassContribution = calculateGrassContribution(landUse)
                .multiply(new BigDecimal("0.20"));

        // 4. 加权求和并乘以归一化系数，再除以县域面积
        BigDecimal totalContribution = waterContribution.add(forestContribution).add(grassContribution);
        return A_CON.multiply(totalContribution)
                .divide(landUse.getCountyArea(), 4, RoundingMode.HALF_UP);
    }

    // 水域贡献值计算（河流、湖库、滩涂、沼泽）
    private static BigDecimal calculateWaterContribution(GuangdongLandUse landUse) {
        // 湖库面积 = 湖泊 + 水库坑塘
        BigDecimal lakeReservoir = landUse.getLakeArea().add(landUse.getReservoirPondArea());
        // 滩涂沼泽面积 = 滩涂 + 沼泽
        BigDecimal tidalMarsh = landUse.getTidalFlat().add(landUse.getMarshland());

        return landUse.getRiverArea().multiply(new BigDecimal("0.10"))      // 河流权重0.1
                .add(lakeReservoir.multiply(new BigDecimal("0.30")))        // 湖库权重0.3
                .add(tidalMarsh.multiply(new BigDecimal("0.60")));         // 滩涂沼泽权重0.6
    }

    // 林地贡献值计算（有林地、灌木林、其他林地）
    private static BigDecimal calculateForestContribution(GuangdongLandUse landUse) {
        return landUse.getForestedLand().multiply(new BigDecimal("0.60"))  // 有林地权重0.6
                .add(landUse.getShrubland().multiply(new BigDecimal("0.25")))  // 灌木林权重0.25
                .add(landUse.getOtherWoodland().multiply(new BigDecimal("0.15"))); // 其他林地权重0.15
    }

    // 草地贡献值计算（高、中、低覆盖度草地）
    private static BigDecimal calculateGrassContribution(GuangdongLandUse landUse) {
        return landUse.getHighCoverageGrassland().multiply(new BigDecimal("0.60"))  // 高覆盖权重0.6
                .add(landUse.getMediumCoverageGrassland().multiply(new BigDecimal("0.30")))  // 中覆盖权重0.3
                .add(landUse.getLowCoverageGrassland().multiply(new BigDecimal("0.10")));    // 低覆盖权重0.1
    }

}
